package com.pets.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 调用百度AI工具类
 */
public class UseBaiDuUtil {

    /**
     * 人脸对比方法
     * @param img1Base64 人脸1图片的base格式数据
     * @param img2Base64 人脸2图片的base格式数据
     * @return
     */
    public static String faceMatch(String img1Base64, String img2Base64) {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/face/v3/match";
        try {

            List<Map<String, Object>> param = new ArrayList<>();
            Map<String, Object> img1 = new HashMap<>();
            Map<String, Object> img2 = new HashMap<>();
            img1.put("image", img1Base64);
            img1.put("image_type", "BASE64");
            img1.put("face_type", "LIVE");
            img1.put("quality_control", "LOW");
            img1.put("liveness_control", "HIGH");
            param.add(img1);
            img2.put("image", img2Base64);
            img2.put("image_type", "BASE64");
            img2.put("face_type", "LIVE");
            img2.put("quality_control", "LOW");
            img2.put("liveness_control", "HIGH");
            param.add(img2);
            String jsonParam = JSONObject.toJSONString(param);
            // 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
            String accessToken = AuthService.getAuth();

            String result = HttpUtil.post(url, accessToken, "application/json", jsonParam);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 录入人脸，往百度云AI人脸库中录入人脸
     * @param imgBase64 需要添加的人脸图片的base64格式数据
     * @param group 往人脸库中添加的分组
     * @param id 往人脸库中添加的图片名称
     * @return 是否添加成功
     */
    public static Boolean add(String imgBase64, String group ,String id) {
        String token = AuthService.getAuth();
        try{
            //String imgParam = URLEncoder.encode(imgStr, "UTF-8");
            //String param = "&image=" + imgBase64 + "&image_type=BASE64&group_id="+group+"&user_id="+ id;

            Map<String, Object> map = new HashMap<>();
            map.put("image", imgBase64);
            map.put("group_id", group);
            map.put("user_id", "user_"+id);
            //map.put("user_info", "abc");
            map.put("liveness_control", "NORMAL");
            map.put("image_type", "BASE64");
            map.put("quality_control", "LOW");
            String param = JSON.toJSONString(map);
            String result = HttpUtil.post("https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add", token,"application/json", param);
           //faceToken:人脸图片的唯一标识
            String faceToken =JSON.parseObject(result).getString("face_token");

            if(StringUtils.isNotBlank(faceToken)){
                return true;
            }
            return false;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 人脸识别比对
     * @param imgBase64 需要对比的人脸图片的base64格式数据
     * @return
     */
    public static String search(String imgBase64) {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/face/v3/search";
        try {
            Map<String, Object> map = new HashMap<>();
            map.put("image", imgBase64);//请求的图片参数
            //	活体检测控制 NONE: 不进行控制 LOW:较低的活体要求(高通过率 低攻击拒绝率)
            //	NORMAL: 一般的活体要求(平衡的攻击拒绝率, 通过率) HIGH: 较高的活体要求(高攻击拒绝率 低通过率) 默认NONE
            map.put("liveness_control", "NORMAL");
            map.put("group_id_list", "group0001");//云端上面人脸库的分组
            map.put("image_type", "BASE64");
            map.put("quality_control", "LOW");//图片质量
            //转成json格式
            String param = JSONObject.toJSONString(map);

            // 注意这里仅为了简化编码每一次请求都去获取access_token，线上环境access_token有过期时间， 客户端可自行缓存，过期后重新获取。
            String accessToken = AuthService.getAuth();

            String result = HttpUtil.post(url, accessToken, "application/json", param);
           /* System.out.println(result);
            JSONObject jo= JSONObject.parseObject(result);
            //获取结果是否成功
            String error_msg= jo.getString("error_msg");
            System.out.println(error_msg);
            //获取结果
            String  result2 = jo.getString("result");*/
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
